// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "Components/GameStateComponent.h"

#include "LyraBotCreationComponent.generated.h"

class ULyraExperienceDefinition;
class ULyraPawnData;
class AAIController;

/**
 * Lyra机器人创建组件，用于在游戏状态中管理机器人的创建和移除
 */
UCLASS(Blueprintable, Abstract)
class ULyraBotCreationComponent : public UGameStateComponent
{
	GENERATED_BODY()

public:
	ULyraBotCreationComponent(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());

	//~UActorComponent接口
	virtual void BeginPlay() override; // 开始播放时调用
	//~End of UActorComponent接口

private:
	/**
	 * 经验加载完成时的回调
	 * @param Experience 加载的经验定义
	 */
	void OnExperienceLoaded(const ULyraExperienceDefinition* Experience);

protected:
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Gameplay)
	int32 NumBotsToCreate = 5; // 要创建的机器人数量

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Gameplay)
	TSubclassOf<AAIController> BotControllerClass; // 机器人控制器类

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Gameplay)
	TArray<FString> RandomBotNames; // 随机机器人名称列表

	TArray<FString> RemainingBotNames; // 剩余的机器人名称

protected:
	UPROPERTY(Transient)
	TArray<TObjectPtr<AAIController>> SpawnedBotList; // 已生成的机器人列表

	/** 总是创建一个机器人 */
	UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category=Gameplay)
	virtual void SpawnOneBot(); // 生成一个机器人

	/** 如果可能，删除最后创建的机器人 */
	UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category=Gameplay)
	virtual void RemoveOneBot(); // 移除一个机器人

	/** 生成机器人直到达到NumBotsToCreate数量 */
	UFUNCTION(BlueprintNativeEvent, BlueprintAuthorityOnly, Category=Gameplay)
	void ServerCreateBots(); // 服务器创建机器人

#if WITH_SERVER_CODE
public:
	void Cheat_AddBot() { SpawnOneBot(); } // 作弊添加机器人
	void Cheat_RemoveBot() { RemoveOneBot(); } // 作弊移除机器人

	/**
	 * 创建机器人名称
	 * @param PlayerIndex 玩家索引
	 * @return 机器人名称
	 */
	FString CreateBotName(int32 PlayerIndex);
#endif
};